package com.sisgesbyte.services.proyeccion;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;

import javax.ejb.EJB;
import javax.ejb.Stateless;
import javax.inject.Inject;

import com.sisgesbyte.common.ConstModAdministracion;
import com.sisgesbyte.common.ConstProyeccion;
import com.sisgesbyte.common.ConstantesInternasSistema;
import com.sisgesbyte.common.Validaciones;
import com.sisgesbyte.dao.beanDao.FiltrosBean;
import com.sisgesbyte.dao.beanDao.FiltrosSQLBean;
import com.sisgesbyte.dao.beanDao.ProyeccionFfvvDetalleResponse;
import com.sisgesbyte.dao.proyeccion.MantProyeccionFFVVDetalleDao;
import com.sisgesbyte.data.entity.comun.GenericEntity;
import com.sisgesbyte.data.entity.proyeccion.ProyeccionFFVVDetalleEntity;
import com.sisgesbyte.services.commonBean.GenericGuardarResponse;
import com.sisgesbyte.services.commonBean.GenericResponse;
import com.sisgesbyte.services.proyeccion.bean.FiltroOpcionesFFVVBean;
import com.sisgesbyte.services.proyeccion.bean.ListaProyeccionFfvvBean;
import com.sisgesbyte.services.proyeccion.bean.ListaProyeccionFfvvDetalleBean;
import com.sisgesbyte.services.proyeccion.bean.ListaProyeccionFfvvDetalleResponse;
import com.sisgesbyte.services.proyeccion.bean.ListaProyeccionFfvvResponse;

@Stateless
public class MantProyeccionFfvvDetalleServiceImpl implements
		MantProyeccionFfvvDetalleService {
	
	@EJB
	private MantProyeccionFFVVDetalleDao mantProyeccionFFVVDetalleDao;
	@EJB
	private MantProyeccionFfvvService mantProyeccionFfvvService;
	@Inject
	private Validaciones validaciones;

	@Override
	public ListaProyeccionFfvvDetalleResponse mostrarProyeccionFfvvDetalle(
			String codTransaccion, FiltroOpcionesFFVVBean filtroOpciones) {
		String mensajeTransaccionMetodo = "[mostrarProyeccionFfvvDetalle idTx=" + codTransaccion + "] - ";
		ListaProyeccionFfvvDetalleResponse response = new ListaProyeccionFfvvDetalleResponse();
		
		List<ProyeccionFFVVDetalleEntity> listaFfvv = null;
		try{
			FiltrosSQLBean filtroSQL = new FiltrosSQLBean();
			List<Object> valores = new ArrayList<>();
			List<FiltrosBean> filtro = new ArrayList<FiltrosBean>();

			if(filtroOpciones.getIdFfvv() > 0){
				FiltrosBean filtroFfvv = new FiltrosBean();
				List<String> campoFfvv = new ArrayList<String>();
				campoFfvv.add("pf.empleado_estructura_id");
				filtroFfvv.setCampos(campoFfvv);
				filtroFfvv.setOperador("=");
				filtro.add(filtroFfvv);
				valores.add(filtroOpciones.getIdFfvv());
			}
			
			if(filtroOpciones.getIdPeriodo() > 0){
				FiltrosBean listaPeriodo = new FiltrosBean();
				List<String> campoPeriodo = new ArrayList<String>();
				campoPeriodo.add("pf.periodo_id");
				listaPeriodo.setCampos(campoPeriodo);
				listaPeriodo.setOperador("=");
				filtro.add(listaPeriodo);
				valores.add(filtroOpciones.getIdPeriodo());
			}
			if(filtroOpciones.getTxtBuscar() !=null){
				if(filtroOpciones.getTxtBuscar().trim().length() > 0){
					// filtro por String
						FiltrosBean listaCampo = new FiltrosBean();
						List<String> campo = new ArrayList<String>();
						campo.add("pfd.id");
						campo.add("m.marca");
						campo.add("p.cod_prod");
						campo.add("p.producto");
						campo.add("cp.nombre");
						listaCampo.setCampos(campo);
						listaCampo.setOperador("like");
						filtro.add(listaCampo);
						valores.add("%" + filtroOpciones.getTxtBuscar() + "%");
				}
					// -------------------
			}

			filtroSQL.setListaFiltros(filtro);
			filtroSQL.setListaValores(valores);
			listaFfvv = mantProyeccionFFVVDetalleDao.listaProyeccionFFVVdetalle(filtroSQL); 
		}catch(Exception e){
			System.out.println(mensajeTransaccionMetodo + "Hubo un error al listar de  BD " + e);
			response.setCodigoRespuesta(ConstProyeccion.PROYECCION_LISTAR_COD_IDT);
			response.setMensajeRespuesta(ConstProyeccion.PROYECCION_LISTAR_MSJ_IDT);
			return response;
		}
		
		if(listaFfvv.size() > 0){
			List<ListaProyeccionFfvvDetalleBean> listaProyeccionFfvv = new ArrayList<ListaProyeccionFfvvDetalleBean>();
			
			for(ProyeccionFFVVDetalleEntity ls : listaFfvv){
				ListaProyeccionFfvvDetalleBean bean = new ListaProyeccionFfvvDetalleBean();
				bean.setCantidadProyectada(ls.getCantidad_proyectada());
				bean.setCategoriaProducto(validaciones.validarCamposString(ls.getCategoria_producto()));
				bean.setCategoriaProductoId(ls.getCategoria_producto_id());
				bean.setCodigoBanda(validaciones.validarCamposString(ls.getCodigo_banda()));
				bean.setCodProd(validaciones.validarCamposString(ls.getCod_prod()));
				bean.setEmpleadoEstructuraId(ls.getEmpleado_estructura_id());
				bean.setId(ls.getId());
				bean.setMarca(validaciones.validarCamposString(ls.getMarca()));
				bean.setMarcaId(ls.getMarca_id());
				bean.setPeriodoId(ls.getPeriodo_id());
				bean.setProducto(validaciones.validarCamposString(ls.getProducto()));
				bean.setProductoId(ls.getProducto_id());
				bean.setProyeccionFfvvId(ls.getProyeccion_ffvv_id());
				bean.setPrecioPromedio(ls.getPrecio_promedio());
				
				listaProyeccionFfvv.add(bean);
			}
			response.setIdTransaccion(codTransaccion);
			response.setCodigoRespuesta(ConstantesInternasSistema.CODIGO_EXITO);
			response.setMensajeRespuesta(ConstantesInternasSistema.MENSAJE_EXITO);
			response.setListaProyeccionFfvvDetalle(listaProyeccionFfvv);
		
		} else {
			response.setIdTransaccion(codTransaccion);
			response.setCodigoRespuesta(ConstProyeccion.PROYECCION_LISTAR_COD_IDF);
			response.setMensajeRespuesta(ConstProyeccion.PROYECCION_LISTAR_MSJ_IDF);
		}

		return response;
	}

	@Override
	public GenericResponse nuevaProyeccioFfvvDetalle(String codTransaccion,
			ListaProyeccionFfvvDetalleBean request) {
		
		String mensajeTransaccionMetodo = "[nuevaProyeccioFfvvDetalle idTx=" + codTransaccion + "] - ";
		GenericResponse response = new GenericResponse();
		boolean existe = false;
		int idProyeccionffvv =0;
		try{
			FiltroOpcionesFFVVBean filtroOpciones =  new FiltroOpcionesFFVVBean();
			filtroOpciones.setIdFfvv(request.getEmpleadoEstructuraId());
			filtroOpciones.setIdPeriodo(request.getPeriodoId());
			//1.- verificamos si existe la proyeccion del personal por monto
			ListaProyeccionFfvvResponse proyFfvv = mantProyeccionFfvvService.mostrarListaProyeccionFfvv(codTransaccion, filtroOpciones);
			if(proyFfvv.getCodigoRespuesta().equalsIgnoreCase(ConstantesInternasSistema.CODIGO_EXITO)){
				existe = true;
				for(ListaProyeccionFfvvBean ls :proyFfvv.getListaProyeccionFfvv() ){
					idProyeccionffvv =ls.getId();
				}
			}
		}catch(Exception e){
			System.out.println(mensajeTransaccionMetodo + "Hubo un error al obtener la Proyeccion en BD " + e);
			response.setCodigoRespuesta(ConstModAdministracion.MANT_NUEVO_COD_IDT);
			response.setMensajeRespuesta(ConstModAdministracion.MANT_NUEVO_MSJ_IDT);
			return response;
		}
		System.out.println("Existe : " + existe);
		if(!existe){
			//2.- creamos la proyeccion por monto para obtener el id
			try{
				ListaProyeccionFfvvBean req = new ListaProyeccionFfvvBean();
				req.setCodigoBanda(" ");
				req.setEmpleadoEstructuraId(request.getEmpleadoEstructuraId());
				req.setPeriodoId(request.getPeriodoId());
				req.setMontoProyectado(BigDecimal.ZERO);
				
				GenericGuardarResponse nuevaProyeccionMonto = mantProyeccionFfvvService.nuevaProyeccionFfvv(codTransaccion, req);

				if(nuevaProyeccionMonto.getCodigoRespuesta().equalsIgnoreCase(ConstantesInternasSistema.CODIGO_EXITO)){
					idProyeccionffvv = Integer.valueOf(nuevaProyeccionMonto.getCodigoSaved());
				}else{
					System.out.println("Error Funcional al tratar de registrar monto proyeccion ffvv");
					response.setCodigoRespuesta(ConstModAdministracion.MANT_NUEVO_COD_IDF);
					response.setMensajeRespuesta(ConstModAdministracion.MANT_NUEVO_MSJ_IDF);
					return response;
				}
			}catch(Exception e){
				System.out.println(mensajeTransaccionMetodo + "Hubo un error al registrar la Proyeccion en BD " + e);
				response.setCodigoRespuesta(ConstModAdministracion.MANT_NUEVO_COD_IDT);
				response.setMensajeRespuesta(ConstModAdministracion.MANT_NUEVO_MSJ_IDT);
				return response;
			}
		}
		
		try{
			ProyeccionFfvvDetalleResponse req = new ProyeccionFfvvDetalleResponse();
			req.setCantidadProyectada(request.getCantidadProyectada());
			req.setCodigoBanda(validaciones.validarCamposString(request.getCodigoBanda()));
			req.setProductoId(request.getProductoId());
			req.setProyeccionFfvvId(idProyeccionffvv);
			//3.- registramos la proyeccion 
			GenericEntity nuevaProy = mantProyeccionFFVVDetalleDao.guardarProyeccionFfvvDet(req);
			if(nuevaProy.getCod_error() == Integer.valueOf(ConstantesInternasSistema.CODIGO_EXITO)){
				//4.- obtemos la suma de la proyeccion de acuerdo al filtro
				BigDecimal totalProyeccion = null;
				try{
					FiltroOpcionesFFVVBean filtro = new FiltroOpcionesFFVVBean();
					filtro.setIdFfvv(request.getEmpleadoEstructuraId());
					filtro.setIdPeriodo(request.getPeriodoId());
					filtro.setTxtBuscar("");
					totalProyeccion =  montoTotalProyeccion(codTransaccion, filtro);
				}catch(Exception e){
					System.out.println(mensajeTransaccionMetodo + "Error al obtener la suma de la proyeccion del canal detalle " + e);
					response.setCodigoRespuesta(ConstProyeccion.PROYECCION_LISTAR_COD_IDT);
					response.setMensajeRespuesta(ConstProyeccion.PROYECCION_LISTAR_MSJ_IDT);
					return response;
				}
				
				//5.- actualizamos la proyeccion total del canal 
				
				try{
					ListaProyeccionFfvvBean  reqFfvv = new ListaProyeccionFfvvBean ();
					reqFfvv.setId(idProyeccionffvv);
					reqFfvv.setEmpleadoEstructuraId(request.getEmpleadoEstructuraId());
					reqFfvv.setMontoProyectado(totalProyeccion);
					reqFfvv.setPeriodoId(request.getPeriodoId());
					reqFfvv.setCodigoBanda("");
					
					GenericResponse actualizarProyFfvv = mantProyeccionFfvvService.editarProyeccionFfvv(codTransaccion, reqFfvv);
					
					if(actualizarProyFfvv.getCodigoRespuesta().equalsIgnoreCase(ConstantesInternasSistema.CODIGO_EXITO)){
						System.out.println("Se registro correctamente la proyeccion ");
						response.setIdTransaccion(codTransaccion);
						response.setCodigoRespuesta(ConstantesInternasSistema.CODIGO_EXITO);
						response.setMensajeRespuesta(ConstantesInternasSistema.MENSAJE_EXITO);
					}else{
						System.out.println("IDF: Hubo un error al actualizar el monto de la proyeccion del canal");
						response.setCodigoRespuesta(ConstModAdministracion.MANT_NUEVO_COD_IDF);
						response.setMensajeRespuesta(ConstModAdministracion.MANT_NUEVO_MSJ_IDF);
					}
					
				}catch(Exception e){
					System.out.println(mensajeTransaccionMetodo + "Hubo un error al actualizar el monto de la proyeccion del canal " + e);
					response.setCodigoRespuesta(ConstModAdministracion.MANT_NUEVO_COD_IDT);
					response.setMensajeRespuesta(ConstModAdministracion.MANT_NUEVO_MSJ_IDT);
					return response;
				}
			}else{
				response.setCodigoRespuesta(String.valueOf(nuevaProy.getCod_error()));
				response.setMensajeRespuesta(nuevaProy.getMsj_error());
			}
			
		}catch(Exception e){
			System.out.println(mensajeTransaccionMetodo + "Hubo un error al registrar la Proyeccion en BD " + e);
			response.setCodigoRespuesta(ConstModAdministracion.MANT_NUEVO_COD_IDT);
			response.setMensajeRespuesta(ConstModAdministracion.MANT_NUEVO_MSJ_IDT);
		}
		
		return response;
	}

	@Override
	public GenericResponse editarProyeccionFfvvDetalle(String codTransaccion,
			ListaProyeccionFfvvDetalleBean request) {
		String mensajeTransaccionMetodo = "[editarProyeccionFfvvDetalle idTx=" + codTransaccion + "] - ";
		GenericResponse response = new GenericResponse();
		
		try{
			ProyeccionFfvvDetalleResponse req = new ProyeccionFfvvDetalleResponse();
			req.setId(request.getId());
			req.setCantidadProyectada(request.getCantidadProyectada());
			req.setCodigoBanda(validaciones.validarCamposString(request.getCodigoBanda()));
			req.setProductoId(request.getProductoId());
			req.setProyeccionFfvvId(request.getProyeccionFfvvId());
			
			GenericEntity nuevaProy = mantProyeccionFFVVDetalleDao.actualizarProyeccionFfvvDet(req);
			
			if(nuevaProy.getCod_error() == Integer.valueOf(ConstantesInternasSistema.CODIGO_EXITO)){
				//2.- obtemos la suma de la proyeccion de acuerdo al filtro
				BigDecimal totalProyeccion = null;
				try{
					FiltroOpcionesFFVVBean filtro = new FiltroOpcionesFFVVBean();
					filtro.setIdFfvv(request.getEmpleadoEstructuraId());
					filtro.setIdPeriodo(request.getPeriodoId());
					filtro.setTxtBuscar("");
					totalProyeccion =  montoTotalProyeccion(codTransaccion, filtro);
				}catch(Exception e){
					System.out.println(mensajeTransaccionMetodo + "Error al obtener la suma de la proyeccion del canal detalle " + e);
					response.setCodigoRespuesta(ConstProyeccion.PROYECCION_LISTAR_COD_IDT);
					response.setMensajeRespuesta(ConstProyeccion.PROYECCION_LISTAR_MSJ_IDT);
					return response;
				}
				
				//3.- actualizamos la proyeccion total del canal 
				
				try{
					ListaProyeccionFfvvBean  reqFfvv = new ListaProyeccionFfvvBean ();
					reqFfvv.setId(request.getProyeccionFfvvId());
					reqFfvv.setEmpleadoEstructuraId(request.getEmpleadoEstructuraId());
					reqFfvv.setMontoProyectado(totalProyeccion);
					reqFfvv.setPeriodoId(request.getPeriodoId());
					reqFfvv.setCodigoBanda("");
					
					GenericResponse actualizarProyFfvv = mantProyeccionFfvvService.editarProyeccionFfvv(codTransaccion, reqFfvv);
					
					if(actualizarProyFfvv.getCodigoRespuesta().equalsIgnoreCase(ConstantesInternasSistema.CODIGO_EXITO)){
						System.out.println("Se actualizo correctamente la proyeccion ");
						response.setIdTransaccion(codTransaccion);
						response.setCodigoRespuesta(ConstantesInternasSistema.CODIGO_EXITO);
						response.setMensajeRespuesta(ConstantesInternasSistema.MENSAJE_EXITO);
					}else{
						System.out.println("IDF: Hubo un error al actualizar el monto de la proyeccion del canal");
						response.setCodigoRespuesta(ConstModAdministracion.MANT_NUEVO_COD_IDF);
						response.setMensajeRespuesta(ConstModAdministracion.MANT_NUEVO_MSJ_IDF);
					}
					
				}catch(Exception e){
					System.out.println(mensajeTransaccionMetodo + "Hubo un error al actualizar el monto de la proyeccion del canal " + e);
					response.setCodigoRespuesta(ConstModAdministracion.MANT_NUEVO_COD_IDT);
					response.setMensajeRespuesta(ConstModAdministracion.MANT_NUEVO_MSJ_IDT);
					return response;
				}
			}else{
				response.setCodigoRespuesta(String.valueOf(nuevaProy.getCod_error()));
				response.setMensajeRespuesta(nuevaProy.getMsj_error());
			}
			
		}catch(Exception e){
			System.out.println(mensajeTransaccionMetodo + "Hubo un error al registrar la Proyeccion en BD " + e);
			response.setCodigoRespuesta(ConstModAdministracion.MANT_NUEVO_COD_IDT);
			response.setMensajeRespuesta(ConstModAdministracion.MANT_NUEVO_MSJ_IDT);
		}
		
		return response;
	}

	@Override
	public GenericResponse deleteProyeccionFfvvDetalle(String codTransaccion,
			ListaProyeccionFfvvDetalleBean request) {
		String mensajeTransaccionMetodo = "[deleteProyeccionFfvvDetalle idTx=" + codTransaccion + "] - ";
		GenericResponse response = new GenericResponse();
		
		try{
			
			GenericEntity nuevaProy = mantProyeccionFFVVDetalleDao.eliminarProyeccionFfvvDet(request.getId());
			
			if(nuevaProy.getCod_error() == Integer.valueOf(ConstantesInternasSistema.CODIGO_EXITO)){
				//2.- obtemos la suma de la proyeccion de acuerdo al filtro
				BigDecimal totalProyeccion = null;
				try{
					FiltroOpcionesFFVVBean filtro = new FiltroOpcionesFFVVBean();
					filtro.setIdFfvv(request.getEmpleadoEstructuraId());
					filtro.setIdPeriodo(request.getPeriodoId());
					filtro.setTxtBuscar("");
					totalProyeccion =  montoTotalProyeccion(codTransaccion, filtro);
				}catch(Exception e){
					System.out.println(mensajeTransaccionMetodo + "Error al obtener la suma de la proyeccion del canal detalle " + e);
					response.setCodigoRespuesta(ConstProyeccion.PROYECCION_LISTAR_COD_IDT);
					response.setMensajeRespuesta(ConstProyeccion.PROYECCION_LISTAR_MSJ_IDT);
					return response;
				}
				
				//3.- actualizamos la proyeccion total del canal 
				
				try{
					ListaProyeccionFfvvBean  reqFfvv = new ListaProyeccionFfvvBean ();
					reqFfvv.setId(request.getProyeccionFfvvId());
					reqFfvv.setEmpleadoEstructuraId(request.getEmpleadoEstructuraId());
					reqFfvv.setMontoProyectado(totalProyeccion);
					reqFfvv.setPeriodoId(request.getPeriodoId());
					reqFfvv.setCodigoBanda("");
					
					GenericResponse actualizarProyFfvv = mantProyeccionFfvvService.editarProyeccionFfvv(codTransaccion, reqFfvv);
					
					if(actualizarProyFfvv.getCodigoRespuesta().equalsIgnoreCase(ConstantesInternasSistema.CODIGO_EXITO)){
						System.out.println("Se registro correctamente la proyeccion ");
						response.setIdTransaccion(codTransaccion);
						response.setCodigoRespuesta(ConstantesInternasSistema.CODIGO_EXITO);
						response.setMensajeRespuesta(ConstantesInternasSistema.MENSAJE_EXITO);
					}else{
						System.out.println("IDF: Hubo un error al actualizar el monto de la proyeccion del canal");
						response.setCodigoRespuesta(ConstModAdministracion.MANT_NUEVO_COD_IDF);
						response.setMensajeRespuesta(ConstModAdministracion.MANT_NUEVO_MSJ_IDF);
					}
					
				}catch(Exception e){
					System.out.println(mensajeTransaccionMetodo + "Hubo un error al actualizar el monto de la proyeccion del canal " + e);
					response.setCodigoRespuesta(ConstModAdministracion.MANT_NUEVO_COD_IDT);
					response.setMensajeRespuesta(ConstModAdministracion.MANT_NUEVO_MSJ_IDT);
					return response;
				}
			}else{
				response.setCodigoRespuesta(String.valueOf(nuevaProy.getCod_error()));
				response.setMensajeRespuesta(nuevaProy.getMsj_error());
			}
			
		}catch(Exception e){
			System.out.println(mensajeTransaccionMetodo + "Hubo un error al registrar la Proyeccion en BD " + e);
			response.setCodigoRespuesta(ConstModAdministracion.MANT_NUEVO_COD_IDT);
			response.setMensajeRespuesta(ConstModAdministracion.MANT_NUEVO_MSJ_IDT);
		}
		
		return response;
	}
	public BigDecimal montoTotalProyeccion(String codTransaccion, FiltroOpcionesFFVVBean filtroBean){
		String mensajeTransaccionMetodo = "[montoTotalProyeccion idTx=" + codTransaccion + "] - ";
		BigDecimal monto = BigDecimal.ZERO;
		
		try{
			 ListaProyeccionFfvvDetalleResponse response =mostrarProyeccionFfvvDetalle( codTransaccion, filtroBean);
			
			if(response.getCodigoRespuesta().equalsIgnoreCase(ConstantesInternasSistema.CODIGO_EXITO)){
				for(ListaProyeccionFfvvDetalleBean ls : response.getListaProyeccionFfvvDetalle()){
					monto = monto.add(ls.getCantidadProyectada().multiply(ls.getPrecioPromedio()));
				}
			}
		}catch(Exception e){
			System.out.println(mensajeTransaccionMetodo + "Error al obtener el monto de la proyeccio " + e);
		}
		
		return monto;
	}
}
